package Visitor;

import Arbori.Nod;
import Functii.Arccos;
import Functii.Arcctg;
import Functii.Arcsin;
import Functii.Arctg;
import Functii.Constanta;
import Functii.Cos;
import Functii.Cosh;
import Functii.Cotangenta;
import Functii.Exponentiala;
import Functii.Functie;
import Functii.Logaritm;
import Functii.Necunoscuta;
import Functii.Putere;
import Functii.Radical;
import Functii.Sin;
import Functii.Sinh;
import Functii.Tangenta;
import Operatori.Cat;
import Operatori.Minus;
import Operatori.Operator;
import Operatori.Plus;
import Operatori.Produs;
import Operatori.Steluta;

public class ToStringVisitor extends Visitor{

	String s;
	
	public ToStringVisitor() {
		this.s="";
	}
	public ToStringVisitor(String s) {
		this.s = s;
	}

	public String getS() {
		return s;
	}

	public void setS(String s) {
		this.s = s;
	}
	
	public void visit(Plus p) {
        visitO(p);
}

public void visit(Minus m) {
        visitO(m);
}

public void visit(Produs p) {
        visitO(p);
}

public void visit(Cat c) {
        visitO(c);
}

public void visitO(Operator o){
        if(o.getFStang() != null && o.getFDrept() != null){
                visit(o.getFStang());
                String s1 = this.s;
                visit(o.getFDrept());
                String s2 = this.s;
                s = o.concatTermeni(s1, s2);
        }
        System.out.println(s);
}

public void visitF(Functie f) {
        if(f.getFStang() != null){
                visit(f.getFStang());
                String s1 = this.s;
                s = f.concatTermeni(s1);
        }
        System.out.println(s);
}
//	public void visit(Plus p) {
//        if(p.getFStang() != null && p.getFDrept() != null){
//                visit(p.getFStang());
//                String s1 = this.s;
//                visit(p.getFDrept());
//                String s2 = this.s;
//                s = p.concatTermeni(s1, s2);
//        }
//	}
//	public void visit(Minus m) {
//        if(m.getFStang() != null && m.getFDrept() != null){
//                visit(m.getFStang());
//                String s1 = this.s;
//                visit(m.getFDrept());
//                String s2 = this.s;
//                s = m.concatTermeni(s1, s2);
//        }
//	}
//	public void visit(Produs p) {
//        if(p.getFStang() != null && p.getFDrept() != null){
//                visit(p.getFStang());
//                String s1 = this.s;
//                visit(p.getFDrept());
//                String s2 = this.s;
//                s = p.concatTermeni(s1, s2);
//        }
//	}
//	public void visit(Cat p) {
//        if(p.getFStang() != null && p.getFDrept() != null){
//                visit(p.getFStang());
//                String s1 = this.s;
//                visit(p.getFDrept());
//                String s2 = this.s;
//                s = p.concatTermeni(s1, s2);
//        }
//	}
//	public void visit(Operator o){
//        if(o.getFStang() != null && o.getFDrept() != null){
//                visit(o.getFStang());
//                String s1 = this.s;
//                visit(o.getFDrept());
//                String s2 = this.s;
//                s = o.concatTermeni(s1, s2);
//        }
//}
//
//	public void visit(Functie f) {
//        if(f.getFStang() != null && f.getFDrept() != null){
//                visit(f.getFStang());
//                String s1 = this.s;
//                s = f.concatTermeni(s1);
//        }
//	} 
	
//	public void visit(Operator o){
//		if(o.getFStang() != null && o.getFDrept() != null){
//			visit(o.getFStang());
//			String s1 = this.s;
//			visit(o.getFDrept());
//			String s2 = this.s;
//			s = o.concatTermeni(s1, s2);
//		}
//	}
//
//	public void visit(Functie f) {
//		if(f.getFStang() != null){
//			visit(f.getFStang());
//			String s1 = this.s;
//			s = f.concatTermeni(s1);
//		}
//	}
	
public void visit(Sin s) {
    visitF(s);
}

public void visit(Cos c) {
    visitF(c);
}

public void visit(Tangenta t) {
    visitF(t);
}

public void visit(Cotangenta c) {
    visitF(c);
}

public void visit(Arcsin as) {
    visitF(as);
}

public void visit(Arccos ac) {
    visitF(ac);
}

public void visit(Arctg at) {
    visitF(at);
}

public void visit(Arcctg ac) {
    visitF(ac);
}

public void visit(Sinh sh) {
    visitF(sh);
}

public void visit(Cosh ch) {
    visitF(ch);
}

public void visit(Constanta c) {
    this.s = Double.toString(c.getCt());
}

public void visit(Necunoscuta n) {
    this.s = "x";
}

public void visit(Radical r) {
    visitF(r);
}

public void visit(Putere p) {
    visitF(p);
}

public void visit(Exponentiala e) {
    visitF(e);
}

public void visit(Logaritm l) {
    visitF(l);
}

public void visit(Nod n) {
    if(n instanceof Necunoscuta) this.visit((Necunoscuta)n);
    if(n instanceof Constanta) this.visit((Constanta)n);
    if(n instanceof Plus) this.visit((Plus)n);
    if(n instanceof Minus) this.visit((Minus)n);
    if(n instanceof Produs) this.visit((Produs)n);
    if(n instanceof Cat) this.visit((Cat)n);
    if(n instanceof Steluta) this.visit((Steluta)n);
    if(n instanceof Exponentiala) this.visit((Exponentiala)n);
    if(n instanceof Logaritm) this.visit((Logaritm)n);
    if(n instanceof Putere) this.visit((Putere)n);
    if(n instanceof Radical) this.visit((Radical)n);
    if(n instanceof Sin) this.visit((Sin)n);
    if(n instanceof Cos) this.visit((Cos)n);
    if(n instanceof Tangenta) this.visit((Tangenta)n);
    if(n instanceof Cotangenta) this.visit((Cotangenta)n);
    if(n instanceof Arcsin) this.visit((Arcsin)n);
    if(n instanceof Arccos) this.visit((Arccos)n);
    if(n instanceof Arctg) this.visit((Arctg)n);
    if(n instanceof Arcctg) this.visit((Arcctg)n);
    if(n instanceof Sinh) this.visit((Sinh)n);
    if(n instanceof Cosh) this.visit((Cosh)n);
    
}
	
	
	
	
	
}
